﻿#include<iostream>
#include<vector>
#include<list>
using namespace std;
using std::cout;
using std::endl;
//文件管理

//C++内存管理方式：
//new / delete

//C++申请对象：new
class A
{
	friend class Sum;
public:
	A(int a = 0)//默认构造
		:_a(a)
	//A(int a)//需要传参/不提供默认构造
	{
		cout << "A(int a)" << endl;
	}

	A(int a1 , int a2 )//默认构造(多参数)
		//A(int a)//需要传参/不提供默认构造
	{
		cout << "A(int a1 , int a2 )" << endl;
	}

	A(const A& aa)
		:_a(aa._a)
	{
		cout << "A(const a& aa)" << endl;
	}

	~A()
	{
		cout << "~A()" << endl;
	}

	A& operator=(const A& aa)
	{
		cout << "A& operator=(const A& aa)" << endl;
		if (this != &aa)
		{
			_a = aa._a;
		}
		return *this;
	}


private:
	int _a;
	int a2;
};

/*
int main()
{
//	int* p1 = new int[10];
//	int* p2 = new int;
	//new + 类型 [ n ]==（申请 n 个int类型的对象）

	//new默认不对内置类型初始化（但是可以手动初始化 如下）
	//对象的初始化：
	// 单个（）/多个{ ，， ...}//多个没有写完：默认初始化为0
	//int* p1 = new int[10]{1,2,3};
	//int* p2 = new int(2);

	//自定义类型的对象:（只有new可以调用构造初始化，malloc不再适用）
	// 
	//除了会开空间/释放空间：还会调用构造和析构
	A* p1 = (A*)malloc(sizeof(A));
	free(p1);
	//使用C语言申请空间再返回/
	//出现的问题：内部成员没有被初始化（私有无法访问初始化）
	
	//自带带参/不带参构造函数、 
	//A* p2 = new A;
	A* p3 = new A(2);
	//多个对象
	cout << endl;
	//A* p4 = new A[10];//10个对象:十次构造和析构

	//初始化：
//	A aa1(1);
//	A aa2(2);//默认构造+拷贝构造==默认构造（有参）
//	A aa3(3);
//	A* p4 = new A[10]{aa1,aa2,aa3};

	//没有默认构造：剩下的七个没有用（有参构造）❌报错

	//用隐式类型转换来对每个对象进行初始化
	A* p4 = new A[10]{ 1,2,3,4,5,{2,3} };
	//A aa1(1)  ->  1
	//多参数：{ ，}传参



	//释放：
	cout << endl;
	delete[] p4;//释放多个对象
	//delete p2;
	delete p3;
		
	return 0;
}

*/
/*
int main()
{
	//底层：operator new (malloc)  +  构造函数
	A* p2 = new A;

	delete p2;
	//析构 + operator delete

	return 0;
}
*/

//

struct ListNode
{
	ListNode* _next;
	int _val;

	//指针和数据有了：还差一个节点
	//C语言是写ByNode(malloc)
	//C++:
	ListNode(int val)
		:_next(nullptr)
		,_val(val)
	{

	}
};

void func()
{
	//new失败了直接抛异常，不需要在检查返回值
	ListNode* n1 = new  ListNode(1);
	ListNode* n2 = new  ListNode(2);
	ListNode* n3 = new  ListNode(3);

	n1->_next = n2;
	n2->_next = n3;
	//n3->_next = nullptr;

	//抛异常：
	//int* p1 = new int[100 * 1024 * 1024];
	//int* p2 = new int[100 * 1024 * 1024];
	//int* p3 = new int[100 * 1024 * 1024];
	//int* p4 = new int[100 * 1024 * 1024];
	//int* p5 = new int[100 * 1024 * 1024];
	//int* p6 = new int[100 * 1024 * 1024];
	//

	//如果抛异常了，程序直接跳转到抛异常，可能跳过了释放空间
	//解决方案：


	delete n1;
	delete n2;
	delete n3;
}
/*
int main()
{
	//抛异常：
	try
	{
		func();
	}
	catch (const exception& e)
	{
		cout << e.what() << endl;
	}
	//
	return 0;
}
*/























































































































